package src.CodeTop;

/**
 * 合并两个有序链表
 * 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 
 *
 *  
 *
 * 示例 1：
 *
 *
 * 输入：l1 = [1,2,4], l2 = [1,3,4]
 * 输出：[1,1,2,3,4,4]
 * 示例 2：
 *
 * 输入：l1 = [], l2 = []
 * 输出：[]
 * 示例 3：
 *
 * 输入：l1 = [], l2 = [0]
 * 输出：[0]
 *
 */

public class _21MergeTwoSortedLists {
    public static void main(String[] args) {
        int[] list1 = {1, 2, 4};
        int[] list2 = {1, 3, 4};
        ListNode l1 = TestListNode.generateLinkedList(3, list1);
        ListNode l2 = TestListNode.generateLinkedList(3, list2);
        ListNode target = mergeTwoLists(l1, l2);
        TestListNode.showLinkedList(target);
    }

    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // 定义目标链表的头结点
        ListNode head = new ListNode(0);
        // 定义辅助指针
        ListNode cur = head;

        // 当两链表都不为空时遍历链表
        while (l1 != null && l2 != null) {
            // 若1链表当前的值小于2链表当前的值
            if (l1.val < l2.val) {
                // 连接到目标链表
                cur.next = l1;
                // 指针后移
                l1 = l1.next;
            }else {
                // 否则
                cur.next = l2;
                l2 = l2.next;
            }
            // 每次连接一个结点目标链表指针后移
            cur = cur.next;
        }
        // 判断此时哪条链表还不为空
        if (l1 != null) {
            cur.next = l1;
        }else if (l2 != null) {
            cur.next = l2;
        }
        return head.next;
    }
}
